今天要來繼續講有關 Azure Blockchain Workbench
的實際使用,上一篇我們看到了要將應用程式上傳到 Azure Blockchain Workbench
提供的網頁,需要兩個檔案:.json
和.sol
,其中.json
裡面寫了有關我們智能合約的功能以及包含的角色權限等,Azure Blockchain Workbench
會根據此份設定檔產生網頁介面。
而.sol
檔案其實和我們之前寫 Smart Contract
相同,一樣是使用 Solidity
語言。
因為篇幅關係,不會把智能合約的寫法從頭介紹,有興趣的朋友可以參考這本中文電子書
並且搭配官方文件使用:https://solidity.readthedocs.io/en/v0.4.24/
在 Azure Blockchain Workbench
中每個合約都會繼承 WorkbenchBase
合約,如下:
contract 合約名稱 is WorkbenchBase('填上applicationName', '填上workflowName')
而 WorkbenchBase
合約內容如下:
其中包含兩個
Event
:WorkbenchContractCreated
、WorkbenchContractUpdated
,當合約觸發相關事件時用來通知Azure Blockchain workbench
的其他服務。
contract WorkbenchBase {
event WorkbenchContractCreated(string applicationName, string workflowName, address originatingAddress);
event WorkbenchContractUpdated(string applicationName, string workflowName, string action, address originatingAddress);
string internal ApplicationName;
string internal WorkflowName;
function WorkbenchBase(string applicationName, string workflowName) internal {
ApplicationName = applicationName;
WorkflowName = workflowName;
}
// 合約創建時觸發
function ContractCreated() internal {
WorkbenchContractCreated(ApplicationName, WorkflowName, msg.sender);
}
// 合約相關狀態更新時觸發
function ContractUpdated(string action) internal {
WorkbenchContractUpdated(ApplicationName, WorkflowName, action, msg.sender);
}
}
接著參考以下範例,一樣把 .sol
檔案與 .json
檔下載後上傳到應用程式網頁上。
https://github.com/Azure-Samples/blockchain/blob/master/blockchain-workbench/application-and-smart-contract-samples/asset-transfer/ethereum/AssetTransfer.sol
這個範例的功能是可以讓使用者互相刊登物品與販售物品。
當我們加入一個使用者為 owner
後可以看到畫面上多了一個 New Contract
按鈕,點選後可以新增一個物品,並設定價格。
如此動作網頁就會發送
API
請求給後端,由後端觸發智能合約上面的相關函式。
再來看一下 Network
:可以看到相關 transaction Hash
但因為 Azure
是自己架設的 Private Ethereum network
所以不會出現在 Mainnet
或 Testnet
的 Etherscan
上面。
點擊下去剛才新增的品項,可以看到一些資訊,Azure
幫我們抓好區塊鏈的資料顯示到網頁上。
可以從 portal
如下加入訪客使用者:
使用訪客使用者的話只需要對方的信箱即可,但對方接到邀請信後還是要點進去按確認然後
Azure
會幫他註冊一個帳號。
然後到應用程式網站點選 Add a member
加入剛才新增的使用者即可。
之後以另一個瀏覽器開啟應用程式網頁,用訪客帳號登入,然後發出 Offer
購買該物品。
我們來看一下 .sol
中 MakeOffer
的程式碼:
function MakeOffer(address inspector, address appraiser, uint256 offerPrice) public
{
if (inspector == 0x0 || appraiser == 0x0 || offerPrice == 0)
{
revert();
}
if (State != StateType.Active)
{
revert();
}
// Cannot enforce "AllowedRoles":["Buyer"] because Role information is unavailable
if (InstanceOwner == msg.sender) // not expressible in the current specification language
{
revert();
}
InstanceBuyer = msg.sender;
InstanceInspector = inspector;
InstanceAppraiser = appraiser;
OfferPrice = offerPrice;
State = StateType.OfferPlaced;
ContractUpdated('MakeOffer');
}
其中要執行
MakeOffer
的話,還需要兩個人:inspector
與appraiser
。而要完成此函式的話,其中offerPrice
不可為 0,以及發出offer
的人不可以是刊登物品的人。
官方這個範例合約只會幫你做紀錄,金額不會真的用例如
transfer
之方法來進行轉帳。
如果發出 Offer
後網頁上以下三個欄位會顯示相關的人名:
以上就大致完成了這個合約的最基本功能:發出 offer
以及買家購買,並且在智能合約上做記錄,然後顯示於網頁上。
各位如果有興趣可以參考其他官方範例玩一下:
https://github.com/Azure-Samples/blockchain/tree/master/blockchain-workbench/application-and-smart-contract-samples